Skill

Null Safety এবং Smart Casts

Mobile App Development - কটলিন (Kotlin)
267

Null Safety এবং Smart Casts

কটলিনে Null Safety এবং Smart Casts দুটি গুরুত্বপূর্ণ ফিচার, যা প্রোগ্রাম লেখার সময় ত্রুটি কমিয়ে আনে এবং কোডের নিরাপত্তা বাড়ায়। কটলিনের ডিজাইন প্রিন্সিপলের একটি অংশ হলো ডেটা টাইপ এবং নাল ভ্যালুর ব্যবস্থাপনা।


১. Null Safety

Null Safety হলো একটি প্রোগ্রামিং ধারণা যা নিশ্চিত করে যে আপনার কোডে নাল রেফারেন্স সমস্যাগুলি কম থাকবে। কটলিনে, ডিফল্টভাবে সব ভ্যারিয়েবল নন-নালেবল হয়, অর্থাৎ আপনি একটি ভ্যারিয়েবলে নাল মান অ্যাসাইন করতে পারবেন না। তবে আপনি যদি নাল মান অনুমতি দিতে চান, তাহলে ভ্যারিয়েবলের টাইপে ? চিহ্ন ব্যবহার করতে হবে।

i) নন-নালেবল টাইপ

var name: String = "Alice"
// name = null // এই লাইনটি ত্রুটি সৃষ্টি করবে

ব্যাখ্যা:

  • এখানে name একটি নন-নালেবল String টাইপের ভ্যারিয়েবল, যা নাল মান গ্রহণ করতে পারবে না।

ii) নালেবল টাইপ

var name: String? = "Bob"
name = null // এটি বৈধ

ব্যাখ্যা:

  • এখানে name একটি নালেবল String? টাইপের ভ্যারিয়েবল, যা নাল মান গ্রহণ করতে পারে।

iii) নাল চেকিং

কটলিনে নাল চেক করার জন্য বিভিন্ন উপায় আছে। if স্টেটমেন্ট ব্যবহার করে নাল চেক করা যায়।

উদাহরণ:

var name: String? = null

if (name != null) {
    println("Name is: $name")
} else {
    println("Name is null")
}

ব্যাখ্যা:

  • এখানে if স্টেটমেন্ট ব্যবহার করে name ভ্যারিয়েবলের মান চেক করা হয়েছে।

iv) নাল সেফ কল অপারেটর

নাল সেফ কল অপারেটর (?.) ব্যবহার করে আপনি নিরাপদভাবে নাল চেক করতে পারেন।

উদাহরণ:

var name: String? = null
println(name?.length) // আউটপুট: null

ব্যাখ্যা:

  • name?.length দিয়ে name নাল হলে length প্রোপার্টি কল করা হবে না এবং আউটপুট null হবে।

v) নাল এলভিশ অপারেটর

নাল এলভিশ অপারেটর (?:) ব্যবহার করে আপনি একটি ডিফল্ট মান প্রদান করতে পারেন।

উদাহরণ:

var name: String? = null
val displayName = name ?: "Unknown"
println(displayName) // আউটপুট: Unknown

ব্যাখ্যা:

  • এখানে যদি name নাল হয়, তবে "Unknown" প্রদর্শিত হবে।

২. Smart Casts

Smart Casts হলো একটি ফিচার যা কটলিনে নাল সেফটি এবং টাইপ চেক করার সাথে সম্পর্কিত। যখন আপনি একটি নাল চেক করেন এবং নিশ্চিত হন যে ভ্যারিয়েবলটি একটি নির্দিষ্ট টাইপের, তখন কটলিন স্বয়ংক্রিয়ভাবে সেই টাইপে ভ্যারিয়েবলটি কাস্ট করে।

i) Smart Cast ব্যবহার

উদাহরণ:

fun printLength(obj: Any) {
    if (obj is String) {
        // এখানে obj স্বয়ংক্রিয়ভাবে String টাইপে কাস্ট করা হয়েছে
        println("String length: ${obj.length}")
    } else {
        println("Not a String")
    }
}

fun main() {
    printLength("Hello") // আউটপুট: String length: 5
    printLength(123)     // আউটপুট: Not a String
}

ব্যাখ্যা:

  • is চেকের মাধ্যমে যদি নিশ্চিত হন যে obj একটি String, তাহলে obj কে String হিসেবে ব্যবহার করা যাবে, এবং কটলিন এটি স্বয়ংক্রিয়ভাবে কাস্ট করবে।

ii) Multiple Types এর Smart Cast

উদাহরণ:

fun describe(obj: Any) {
    when (obj) {
        is String -> println("String of length ${obj.length}") // Smart Cast
        is Int -> println("Integer: $obj")
        is Double -> println("Double: $obj")
        else -> println("Unknown type")
    }
}

fun main() {
    describe("Hello") // আউটপুট: String of length 5
    describe(42)      // আউটপুট: Integer: 42
    describe(3.14)    // আউটপুট: Double: 3.14
}

ব্যাখ্যা:

  • এখানে when স্টেটমেন্ট ব্যবহার করে বিভিন্ন টাইপের জন্য Smart Cast কাজ করছে।

উপসংহার

কটলিনে Null Safety এবং Smart Casts ফিচারগুলি প্রোগ্রামারদের নাল রেফারেন্স সমস্যা কমাতে এবং কোডের রিডেবিলিটি বাড়াতে সাহায্য করে। Null Safety নিশ্চিত করে যে আপনার কোডে নাল রেফারেন্স সমস্যা হবে না, এবং Smart Casts টাইপ চেক করার সময় আপনাকে আরও ফ্লেক্সিবল এবং নিরাপদ কোড লেখার সুযোগ দেয়।

Content added By

NullPointerException এর সমস্যা

179

NullPointerException এর সমস্যা

কটলিন একটি null-safe ভাষা, যার অর্থ এটি null এর সাথে কাজ করার সময় সাধারণ সমস্যা গুলোকে এড়াতে সাহায্য করে। তবে, যেকোনো প্রোগ্রামিং ভাষায় NullPointerException (NPE) একটি সাধারণ সমস্যা। এটি তখন ঘটে যখন আপনি null মানযুক্ত একটি অবজেক্টের কোন প্রোপার্টি বা মেথড অ্যাক্সেস করার চেষ্টা করেন। কটলিনে এই সমস্যা সমাধানে বেশ কিছু ফিচার রয়েছে। নিচে NullPointerException এর সমস্যা এবং কটলিনে এটি মোকাবেলা করার উপায় নিয়ে বিস্তারিত আলোচনা করা হলো।


১. NullPointerException কি?

NullPointerException হলো একটি রানটাইম এক্সসেপশন যা ঘটে যখন আপনি একটি null অবজেক্টের মেথড কল করার চেষ্টা করেন বা null ভ্যারিয়েবলের প্রোপার্টি অ্যাক্সেস করার চেষ্টা করেন।

উদাহরণ:

fun main() {
    var name: String? = null
    println(name.length) // এখানে NullPointerException ঘটবে
}

ব্যাখ্যা:

  • এখানে name একটি nullable String এবং এটি null ভ্যালু ধারণ করে। name.length কল করলে NullPointerException হবে কারণ name null।

২. Nullable এবং Non-nullable Types

কটলিনে, আপনি টাইপ ডিফাইন করার সময় নির্ধারণ করতে পারেন যে ভ্যারিয়েবলটি nullable কি না।

  • Non-nullable Type: যদি একটি ভ্যারিয়েবল non-nullable হয়, তবে এটি কখনো null হতে পারে না।
var nonNullableName: String = "Alice"
// nonNullableName = null // এটি কম্পাইলার এরর দিবে
  • Nullable Type: যদি একটি ভ্যারিয়েবল nullable হয়, তবে এটি ? সিম্বল ব্যবহার করে ডিফাইন করতে হয়।
var nullableName: String? = null

৩. Safe Call Operator (?.)

Safe call operator ?. ব্যবহার করে আপনি null অবজেক্টের মেথড বা প্রোপার্টি অ্যাক্সেস করতে পারেন। যদি অবজেক্টটি null হয়, তবে এক্সপ্রেশনটি null রিটার্ন করবে এবং NullPointerException হবে না।

উদাহরণ:

fun main() {
    var name: String? = null
    println(name?.length) // আউটপুট: null (NullPointerException হবে না)
}

৪. Elvis Operator (?:)

Elvis operator ব্যবহার করে আপনি null চেক করার সময় একটি ডিফল্ট মান প্রদান করতে পারেন।

উদাহরণ:

fun main() {
    var name: String? = null
    val length = name?.length ?: 0 // যদি name null হয়, তবে 0 রিটার্ন করবে
    println(length) // আউটপুট: 0
}

৫. Not-null Assertion Operator (!!)

Not-null assertion operator !! ব্যবহার করে আপনি একটি nullable ভ্যারিয়েবলকে non-null হিসেবে ঘোষণা করতে পারেন। তবে এটি ব্যবহার করার সময় সতর্ক থাকতে হবে, কারণ যদি ভ্যারিয়েবলটি null হয়, তাহলে NullPointerException ঘটবে।

উদাহরণ:

fun main() {
    var name: String? = null
    println(name!!.length) // এখানে NullPointerException ঘটবে
}

৬. Lateinit Modifier

lateinit মডিফায়ার ব্যবহার করে আপনি একটি non-nullable ভ্যারিয়েবল ঘোষণা করতে পারেন যা পরে ইনিশিয়ালাইজ হবে। এটি সাধারণত ডিপেন্ডেন্সি ইনজেকশন বা অ্যানিমেশন এর ক্ষেত্রে ব্যবহৃত হয়।

উদাহরণ:

lateinit var name: String

fun main() {
    name = "Alice"
    println(name.length) // আউটপুট: 5
}
  • এখানে name কে lateinit ব্যবহার করে ঘোষণা করা হয়েছে। এটি পরে ইনিশিয়ালাইজ করা হয়েছে, তাই যখন name.length কল করা হয়, তখন কোনো সমস্যা হবে না।

৭. Null Safety Functions

কটলিনে অনেক ফাংশন ডিফাইন করা যায় যেগুলো null সেফ ডেটা ম্যানিপুলেশনে সাহায্য করে।

উদাহরণ:

fun printName(name: String?) {
    name?.let { 
        println("Name: $it")
    } ?: run {
        println("Name is null")
    }
}

fun main() {
    printName(null) // আউটপুট: Name is null
    printName("Bob") // আউটপুট: Name: Bob
}
  • এখানে let ফাংশনটি null চেক করে, এবং যদি name null না হয়, তবে এটি println কল করবে। অন্যথায়, run ব্লকটি চলবে।

উপসংহার

NullPointerException হলো একটি সাধারণ সমস্যা, তবে কটলিনের null-safety ফিচারগুলো এটি মোকাবেলার জন্য কার্যকর। Nullable এবং non-nullable টাইপের মাধ্যমে কোডের নিরাপত্তা নিশ্চিত করা যায়। Safe call operator, Elvis operator, and late initialization ব্যবহার করে null সম্পর্কিত সমস্যাগুলো থেকে মুক্ত থাকা সম্ভব।

Content added By

Safe Calls (?.) এবং Elvis Operator (?:)

233

Safe Calls (?.) এবং Elvis Operator (?:)

কটলিনে Safe Calls এবং Elvis Operator ব্যবহার করে null সেফটি নিশ্চিত করা হয়, যা কোডের নিরাপত্তা এবং স্থিতিশীলতা বাড়ায়। এগুলো null পয়েন্টার এক্সেপশন (NullPointerException) থেকে রক্ষা করতে সাহায্য করে এবং নিরাপদভাবে মানের অ্যাক্সেস করতে দেয়। নিচে এই কনসেপ্টগুলো বিস্তারিত আলোচনা করা হলো:


১. Safe Calls (?.)

Safe Calls ব্যবহার করে আপনি null হতে পারে এমন একটি অবজেক্টের প্রোপার্টি বা মেথডকে নিরাপদে এক্সেস করতে পারেন। Safe Call অপারেটর ?. ব্যবহার করে, যদি অবজেক্টটি null হয়, তাহলে এটি null রিটার্ন করবে এবং এক্সেপশন ঘটবে না।

উদাহরণ:

data class User(val name: String, val age: Int)

fun main() {
    val user: User? = null

    // Safe call
    val userName = user?.name
    println(userName) // আউটপুট: null
}

ব্যাখ্যা:

  • এখানে user একটি nullable User অবজেক্ট, যা null হতে পারে।
  • user?.name এর মাধ্যমে আমরা name প্রোপার্টি অ্যাক্সেস করার চেষ্টা করছি। যদি user null হয়, তাহলে userName null হয়ে যাবে এবং কোনো এক্সেপশন ঘটবে না।

২. Elvis Operator (?:)

Elvis Operator ?: ব্যবহার করে একটি ডিফল্ট মান প্রদান করতে পারেন যখন একটি মান null হয়। এটি Safe Calls-এর সাথে ব্যবহার করা হয়।

উদাহরণ:

fun main() {
    val user: User? = null

    // Safe call with Elvis operator
    val userName = user?.name ?: "Unknown User"
    println(userName) // আউটপুট: Unknown User
}

ব্যাখ্যা:

  • এখানে, user?.name যদি null হয়, তাহলে Elvis Operator (?:) ডিফল্ট মান "Unknown User" প্রদান করবে।
  • ফলে, userName variable এ "Unknown User" সংরক্ষণ হবে।

৩. Safe Calls এবং Elvis Operator একসাথে ব্যবহার

Safe Calls এবং Elvis Operator একসাথে ব্যবহার করলে, আপনি সহজেই nullable ভ্যালু প্রসেস করতে পারেন এবং একটি ডিফল্ট মান নিশ্চিত করতে পারেন।

উদাহরণ:

data class Address(val street: String)

data class User(val name: String, val age: Int, val address: Address?)

fun main() {
    val user: User? = User("Alice", 30, null)

    val street = user?.address?.street ?: "Street not available"
    println(street) // আউটপুট: Street not available
}

ব্যাখ্যা:

  • এখানে user এর address প্রোপার্টি null, তাই user?.address?.street null হবে।
  • Elvis Operator ব্যবহার করে, ডিফল্ট মান "Street not available" প্রদান করা হচ্ছে।

৪. চেইনিং Safe Calls

Safe Calls চেইনিং করার মাধ্যমে আপনি nested প্রোপার্টি নিরাপদে অ্যাক্সেস করতে পারেন।

উদাহরণ:

data class City(val name: String)

data class Address(val street: String, val city: City?)

data class User(val name: String, val address: Address?)

fun main() {
    val user: User? = User("Bob", Address("5th Avenue", null))

    // Chaining safe calls
    val cityName = user?.address?.city?.name ?: "City not available"
    println(cityName) // আউটপুট: City not available
}

ব্যাখ্যা:

  • এখানে user এর address এবং city প্রোপার্টি চেইন করে অ্যাক্সেস করা হয়েছে।
  • যদি কোন স্তরে null থাকে, তাহলে Safe Calls ব্যবহারের মাধ্যমে পুরো চেইনটি নিরাপদে কাজ করবে এবং Elvis Operator ডিফল্ট মান প্রদান করবে।

উপসংহার

কটলিনের Safe Calls (?.) এবং Elvis Operator (?:) ব্যবহার করে আপনি সহজেই null সেফটি নিশ্চিত করতে পারেন, যা প্রোগ্রামের স্থিতিশীলতা বাড়ায় এবং null পয়েন্টার এক্সেপশন থেকে রক্ষা করে। এগুলো ব্যবহার করা সহজ এবং কোডকে আরও পরিষ্কার করে তোলে।

Content added By

Non-null Assertion (!!)

267

Non-null Assertion (!!)

কটলিনে Non-null Assertion বা !! অপারেটর ব্যবহৃত হয় একটি নালেবল টাইপ ভ্যারিয়েবলের উপর নিশ্চিত করতে যে এটি নাল নয়। যদি ভ্যারিয়েবলটি নাল হয়, তবে এটি NullPointerException উত্থাপন করে। এই অপারেটরটি সেই সময় ব্যবহৃত হয় যখন আপনি জানেন যে ভ্যারিয়েবলটি নাল নয় এবং আপনি এটি নাল হিসেবে ধারণ করতে চান না।

কিভাবে কাজ করে

!! অপারেটর কটলিনের নাল সেফটি বৈশিষ্ট্যের একটি অংশ। আপনি যখন একটি নালেবল টাইপ ভ্যারিয়েবলকে !! দিয়ে কাস্ট করেন, তখন এটি ঐ ভ্যারিয়েবলের মানকে নন-নাল হিসেবে গ্রহণ করে। যদি সেই ভ্যারিয়েবলটির মান আসলে নাল হয়, তবে এটি একটি রানটাইম ত্রুটি তৈরি করবে।

ব্যবহার উদাহরণ

উদাহরণ ১: সাধারণ ব্যবহার

fun main() {
    var name: String? = "Alice"
    // var name: String? = null // Uncomment this line to see the exception

    // Non-null assertion
    println(name!!) // আউটপুট: Alice
}

ব্যাখ্যা:

  • এখানে, name ভ্যারিয়েবলটি একটি নালেবল String? টাইপ।
  • name!! ব্যবহার করে আমরা নিশ্চিত করছি যে name নাল নয়। যদি name নাল হয়, তবে এটি NullPointerException ছুঁড়বে।

উদাহরণ ২: NullPointerException তৈরি করা

fun main() {
    var name: String? = null

    // Non-null assertion leading to exception
    println(name!!) // আউটপুট: Exception in thread "main" java.lang.NullPointerException
}

ব্যাখ্যা:

  • এখানে name ভ্যারিয়েবলটি নাল। name!! ব্যবহার করার ফলে NullPointerException হবে, কারণ আমরা নাল ভ্যালুর উপর কাজ করার চেষ্টা করছি।

কবে ব্যবহার করবেন

  • বিস্তারিত সতর্কতা: !! অপারেটর ব্যবহার করার সময় সতর্ক থাকা উচিত। কারণ এটি একটি নিশ্চিত নাল ভ্যালু ধরে নিয়ে রানটাইমে ত্রুটি তৈরি করতে পারে। তাই আপনি যখন নিশ্চিত যে ভ্যারিয়েবলটি নাল নয় তখনই এটি ব্যবহার করা উচিত।
  • সাধারণত এটি তখন ব্যবহার করা হয় যখন আপনি একটি লজিক্যাল পরিস্থিতিতে নিশ্চিত হন যে নাল ভ্যালু আসবে না, যেমন:
    • যখন আপনি একটি API থেকে ডেটা নিয়ে আসছেন এবং জানেন যে তা কখনও নাল হবে না।
    • যখন আপনি ক্লাসের কনস্ট্রাক্টরের মাধ্যমে একটি প্রোপার্টি ইনিশিয়ালাইজ করেছেন।

উপসংহার

কটলিনে Non-null Assertion (!!) অপারেটর ব্যবহার করে আপনি নালেবল ভ্যারিয়েবলের মানকে নন-নাল হিসেবে নিশ্চিত করতে পারেন, তবে এটি ব্যবহার করার সময় সতর্ক থাকতে হবে। এটি কোডের নিরাপত্তা এবং বিশ্বাসযোগ্যতা বাড়াতে সাহায্য করে, কিন্তু যদি সঠিকভাবে ব্যবহৃত না হয়, তবে এটি রানটাইম ত্রুটি সৃষ্টি করতে পারে।

Content added By

Smart Casts এবং Type Checking

230

Smart Casts এবং Type Checking

কটলিনে Smart Casts এবং Type Checking ফিচারগুলি শক্তিশালী এবং কার্যকরী উপায়ে টাইপ সেফটি নিশ্চিত করে। এই ফিচারগুলো আপনার কোডে সঠিক টাইপের অবজেক্টগুলোর উপর ভিত্তি করে কাজ করতে সহায়তা করে এবং কোডকে আরও রিডেবল ও নিরাপদ করে তোলে। নিচে এই দুটি বিষয়ে বিস্তারিত আলোচনা করা হলো।


১. Type Checking

Type checking হল একটি প্রক্রিয়া যা নিশ্চিত করে যে একটি ভ্যারিয়েবল একটি নির্দিষ্ট টাইপের অবজেক্টকে ধারণ করছে। কটলিনে, আপনি is অপারেটর ব্যবহার করে টাইপ চেক করতে পারেন।

উদাহরণ:

fun main() {
    val obj: Any = "Hello, Kotlin"

    if (obj is String) {
        println("The string length is: ${obj.length}") // এটি কাজ করবে
    } else {
        println("Not a String")
    }
}

ব্যাখ্যা:

  • এখানে obj একটি Any টাইপের ভ্যারিয়েবল, যা যে কোনো ডেটা টাইপ ধারণ করতে পারে।
  • if (obj is String) দ্বারা চেক করা হচ্ছে যে obj একটি String টাইপের অবজেক্ট কিনা। যদি তাই হয়, তাহলে obj.length ব্যবহার করে স্ট্রিংয়ের দৈর্ঘ্য প্রিন্ট করা হবে।

২. Smart Casts

কটলিনে, যদি আপনি একটি টাইপ চেক করেন এবং সেটি সফল হয়, তাহলে আপনাকে আবার সেই টাইপে কাস্ট করতে হবে না। কটলিন স্বয়ংক্রিয়ভাবে টাইপ কাস্টিং করে দেয়। এটিকে Smart Cast বলা হয়।

উদাহরণ:

fun main() {
    val obj: Any = "Hello, Kotlin"

    if (obj is String) {
        println("The string length is: ${obj.length}") // এখানে Smart Cast হয়েছে
    }
}

ব্যাখ্যা:

  • obj is String চেক করার পর, কটলিন জানে যে obj এখন একটি String টাইপ। তাই obj.length কল করার সময় আর কাস্ট করার প্রয়োজন নেই।

৩. Null Safety এবং Smart Casts

Smart casts কটলিনের null-safety ফিচারের সাথে মিলিতভাবে কাজ করে। আপনি যদি একটি nullable টাইপের অবজেক্টের জন্য টাইপ চেক করেন, তাহলে Smart Cast সঠিকভাবে কাজ করবে।

উদাহরণ:

fun printLength(obj: Any?) {
    if (obj is String) {
        println("The string length is: ${obj.length}") // Smart Cast
    } else {
        println("Not a String or is null")
    }
}

fun main() {
    printLength("Hello, Kotlin") // আউটপুট: The string length is: 15
    printLength(null)             // আউটপুট: Not a String or is null
}

ব্যাখ্যা:

  • printLength ফাংশনে obj একটি nullable টাইপ, তাই প্রথমে চেক করা হচ্ছে is String
  • Smart Cast obj কে String হিসেবে অ্যাক্সেস করতে দেয়, যদি এটি null না হয়।

৪. Smart Casts with when

কটলিনে when স্টেটমেন্টের সাথে Smart Cast ব্যবহার করে বিভিন্ন টাইপের অবজেক্টকে সহজেই পরিচালনা করা যায়।

উদাহরণ:

fun handleInput(input: Any) {
    when (input) {
        is Int -> println("Integer: $input")
        is String -> println("String: $input")
        is Double -> println("Double: $input")
        else -> println("Unknown type")
    }
}

fun main() {
    handleInput(42)            // আউটপুট: Integer: 42
    handleInput("Kotlin")      // আউটপুট: String: Kotlin
    handleInput(3.14)          // আউটপুট: Double: 3.14
    handleInput(true)          // আউটপুট: Unknown type
}

ব্যাখ্যা:

  • when স্টেটমেন্টে টাইপ চেক করার মাধ্যমে প্রতিটি ইনপুট টাইপের জন্য পৃথক কাজ করা হচ্ছে।
  • Smart Cast দ্বারা ইনপুট ভ্যারিয়েবলের টাইপ অনুযায়ী সঠিক কাজটি করা হচ্ছে।

৫. Explicit Cast

যখন Smart Cast কাজ করে না, তখন আপনি as বা as? ব্যবহার করে এক্সপ্লিসিট কাস্ট করতে পারেন।

উদাহরণ:

fun main() {
    val obj: Any = "Hello, Kotlin"
    val str: String = obj as String // Explicit Cast
    println("String length: ${str.length}") // আউটপুট: String length: 15
}
  • এখানে obj কে String হিসেবে কাস্ট করা হয়েছে। যদি obj null বা অন্য টাইপ হয়, তবে এটি ClassCastException তৈরি করবে।

Safe Cast

fun main() {
    val obj: Any = "Hello, Kotlin"
    val str: String? = obj as? String // Safe Cast
    println("String length: ${str?.length ?: "Not a String"}") // আউটপুট: String length: 15
}
  • এখানে as? ব্যবহার করে obj কে String হিসেবে সেফলি কাস্ট করা হয়েছে। যদি কাস্ট সফল না হয়, তবে null রিটার্ন হবে।

উপসংহার

কটলিনের Smart Casts এবং Type Checking ফিচারগুলি টাইপ সেফটি নিশ্চিত করতে এবং কোডকে আরও রিডেবল ও নিরাপদ করতে সাহায্য করে। Smart Casts স্বয়ংক্রিয়ভাবে টাইপ কাস্টিংয়ের প্রয়োজনীয়তা কমিয়ে আনে, যা প্রোগ্রামিংয়ের সময় সঞ্চয় করে এবং ভুলের সম্ভাবনা কমায়।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...